package cn.xkai.exercise.a;

/**
 * @description: 字符串转换整数 (atoi)
 * 0 <= s.length <= 200
 * s 由英文字母（大写和小写）、数字（0-9）、' '、'+'、'-' 和 '.' 组成
 * <p>
 * 自己的思路：题没读懂，只需要头部的正负号和数字，其他全忽略， 未完成
 * 借鉴的思路：一个个字符进行判断，发现不是数字或者溢出时及时退出
 * 定义一个指针index 指向正在判断的字符
 * 先把空格去掉index++
 * 再判断是否有符号 index++ 并保留
 * 遇到非数字直接return
 * 先允许越界，越界后数据肯定和期望值不同，整除10后和原来的数比较即可，根据符号返回对应的最值
 * 返回结果时，带上符号
 * @author: kaixiang
 * @date: 2022-07-06
 **/
public class Solution35 {
    public int myAtoi(String s) {
        char[] chars = s.toCharArray();
        int length = chars.length;
        int index = 0;
        // 先去除空格
        while (index < length && chars[index] == ' ') {
            index++;
        }
        // 极端情况 "  " 和""
        if (index >= length) {
            return 0;
        }
        // 再判断符号
        int sign = 1;
        if (chars[index] == '-' || chars[index] == '+') {
            if (chars[index] == '-') {
                sign = -1;
            }
            index++;
        }
        int result = 0;
        int temp = 0;
        while (index < length) {
            int num = chars[index] - '0';
            if (num > 9 || num < 0) {
                break;
            }
            temp = result;
            result = result * 10 + num;
            // 越界后，数值和期望数值发生变化，取余再除10获取原始值，比对判断
            if (result / 10 != temp) {
                if (sign > 0) {
                    return Integer.MAX_VALUE;
                } else {
                    return Integer.MIN_VALUE;
                }
            }
            index++;
        }
        return result * sign;
    }

    public static void main(String[] args) {
        String s = "9223372036854775808";
        Solution35 solution35 = new Solution35();
        System.out.println(solution35.myAtoi(s));
    }
}
